package com.itheima.health.config;

import com.itheima.health.security.SecurityUserDetailsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.authentication.configurers.provisioning.InMemoryUserDetailsManagerConfigurer;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    @Autowired
    private SecurityUserDetailsService userDetailsService;
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        // 指定访问控制规则
        // 1-通过authorizeRequests()开启一个拦截规则
        // 2-通过antMatchers()指定需要拦截的资源，参数为ant表达式
        // 3-通过access()指定访问该资源所需要的权限，参数为权限表达式

        //通过permitAll()指定无需访问控制的资源
        http.authorizeRequests()
                .antMatchers("*.js","*.css").access("permitAll()");
        //通过hasAnyAuthority()指定具备任何一个autority就可以访问的资源
        http.authorizeRequests()
                .antMatchers("/pages/checkitem.html").access("hasAnyAuthority('ROLE_ADMIN','add')");
        //通过hasAnyAuthority()指定具备某个autority就可以访问的资源
        http.authorizeRequests()
                .antMatchers("/pages/checkgroup.html").access("hasAuthority('find')");
        // 通过authenticated()指定该资源需要登陆后才可以访问
        http.authorizeRequests()
                .antMatchers("/main.html","/pages/**").access("isAuthenticated()");

        //==============================================================
        // 配置登录表单相关内容
        http.formLogin()
                .loginPage("/login.html")// 登录页地址
                .loginProcessingUrl("/sec/login") // 登录请求地址
                .failureUrl("/login-fail.html") // 登录失败转地址
                .defaultSuccessUrl("/main.html"); // 登录成功转发地址
        // 如果使用我们自己定义的页面，需要关闭防止csrf攻击验证，否则我们的页面也需要加入对应的复杂逻辑。
        http.csrf().disable();
        // 配置登出相关内容
        http.logout()
                .logoutUrl("/sec/logout") // 登出接口
                .logoutSuccessUrl("/login.html");// 登出成功以后的跳转地址
        // 配置权限不足页面
        http.exceptionHandling().accessDeniedPage("/auth-fail.html");
    }
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
//        // 用户详情创建一个配置类
//        InMemoryUserDetailsManagerConfigurer<AuthenticationManagerBuilder> configure = auth.inMemoryAuthentication();
//        // 配置三个用户
//        // 密码格式：{算法}密文      noop表示不加密
//        // authorities用于提供用户的角色和权限，默认带ROLE_前缀的是角色，否则是权限
//        configure.withUser("admin").password("{noop}1234").authorities("ROLE_ADMIN");
//        configure.withUser("zhangsan").password("{noop}1234").authorities("ROLE_01","add");
//        configure.withUser("lisi").password("{MD5}81dc9bdb52d04dc20036dbd8313ed055")
//                .authorities("ROLE_02","find");
        // 设置自定义的UserDetailService
        auth.userDetailsService(userDetailsService);
    }
}
